home *** CD-ROM | disk | FTP | other *** search
- /*
- * MultiMAIL offline mail reader
- *
-
- Written by Kolossvary Tamas (thomas@vma.bme.hu)
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
-
- #include "interface.h"
-
- extern Welcome welcome;
- extern PacketListWindow packets;
- extern AreaListWindow areas;
- extern LetterListWindow letters;
- extern LetterWindow letterwindow;
- extern HelpWindow helpwindow;
- extern mmail mm;
- extern packet_list *packetList;
- extern area_list *areaList;
- extern letter_list *letterList;
- extern Interface *interface;
- extern LittleAreaListWindow *littleareas;
- extern AddressBook addresses;
-
- Interface :: Interface(int mode)
- {
- screen_init(mode);
- letterwindow.set_columns(COLS);
- welcome.MakeActive();
- packets.MakeActive();
- state = packetlist;
- dontcallEnterLetter = 0;
- unsaved_reply = 0;
- doupdate();
- }
-
- statetype Interface :: active(void)
- {
- return state;
- }
-
- void Interface :: select(void)
- {
- switch(state)
- {
- case packetlist: packets.Delete();
- welcome.Delete();
- erase();
- refresh();
- mm.selectPacket(packetList->getName());
- clearok(screen, TRUE);
- touchwin(screen);
- wnoutrefresh(screen);
- areas.MakeActive();
- areas.FirstUnread();
- state=arealist;
- break;
- case arealist: if(mm.areaList->getNoOfLetters() > 0)
- {
- areas.Delete();
- letters.MakeActive();
- letters.FirstUnread();
- state=letterlist;
- }
- break;
- case letterlist: letters.Delete();
- letterwindow.MakeActive();
- state=letter;
- break;
- case threadlist: break;
- case letter: letterwindow.Next(); break;
- case letter_help:helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: delete littleareas;
- if(strcmp(mm.areaList->getShortName(), "NET") == 0)
- if((Key == 'N') || (Key == 'E'))
- addresses.MakeActive();
- else
- {
- net_address nm;
-
- nm = letterwindow.PickNetAddr();
- letterwindow.set_Letter_Params(&nm,
- NULL);
- }
- Key = '\0';
- areas.Reset_areaList();
- letterwindow.ReDraw();
- state = letter;
- if(!dontcallEnterLetter)
- letterwindow.EnterLetter();
- else
- dontcallEnterLetter = 0;
- break;
- }
- }
-
- int Interface :: back(void)
- {
- switch(state)
- {
- case packetlist: if(WarningWindow("Do You really want to quit?",
- "Yes", "No"))
- {
-
- packets.Delete();
- welcome.Delete();
- return 1;
- }
- else
- {
- touchwin(screen);
- wnoutrefresh(screen);
- welcome.ReDraw();
- packets.ReDraw();
- helpwindow.redraw();
- return 0;
- }
- case arealist: if(WarningWindow("Save Lastread Pointers?", "Yes", "No"))
- mm.saveRead();
- if(unsaved_reply)
- if(WarningWindow("The content of the reply area has changed. Create new packet?",
- "Yes", "No"))
- create_reply_packet();
- areas.Delete();
- packets.MakeActive();
- welcome.MakeActive();
- state=packetlist;
- break;
- case letterlist: letters.Delete();
- areas.MakeActive();
- state=arealist;
- break;
- case threadlist: break;
- case letter: letterwindow.Delete();
- letters.MakeActive();
- letters.Draw();
- state=letterlist;
- break;
- case letter_help:helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: delete littleareas;
- areas.Reset_areaList();
- state = letter;
- break;
- }
- return 0;
- }
-
- void Interface :: ReplyPacket(void)
- {
- if(state == arealist)
- {
- if(WarningWindow("This will overwrite existing reply packet. Continue?",
- "Yes", "No"))
- {
- create_reply_packet();
- }
- else
- areas.ReDraw();
- }
- }
-
- void Interface :: create_reply_packet(void)
- {
- erase();
- refresh();
- mm.areaList->makeReply(REPLY_AREA);
- unsaved_reply = 0;
- clearok(screen, TRUE);
- touchwin(screen);
- wnoutrefresh(screen);
- areas.ReDraw();
- helpwindow.redraw();
- }
-
- void Interface :: DOWN_ARROW(void)
- {
- switch(state)
- {
- case packetlist: packets.Move(DOWN); packets.Draw(); break;
- case arealist: areas.Move(DOWN); areas.Draw(); break;
- case letterlist: letters.Move(DOWN); letters.Draw(); break;
- case threadlist: break;
- case letter: letterwindow.Move(DOWN); break;
- case letter_help:helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: littleareas->Move(DOWN);
- littleareas->Draw();
- break;
- }
- }
-
- void Interface :: UP_ARROW(void)
- {
- switch(state)
- {
- case packetlist: packets.Move(UP); packets.Draw(); break;
- case arealist: areas.Move(UP); areas.Draw(); break;
- case letterlist: letters.Move(UP); letters.Draw(); break;
- case threadlist: break;
- case letter: letterwindow.Move(UP); break;
- case letter_help:helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: littleareas->Move(UP);
- littleareas->Draw();
- break;
- }
- }
-
- void Interface :: RIGHT_ARROW(void)
- {
- switch(state)
- {
- case packetlist: packets.Move(DOWN); packets.Draw(); break;
- case arealist: do
- {
- areas.Move(DOWN); areas.Draw();
- } while((mm.areaList->getNoOfLetters() == 0) &&
- (mm.areaList->getAreaNo() < mm.areaList->noOfAreas()));
- if (mm.areaList->getAreaNo() == mm.areaList->noOfAreas() &&
- (mm.areaList->getNoOfLetters() == 0))
- this->UP_ARROW();
- break;
- case letterlist: letters.Move(DOWN); letters.Draw(); break;
- case threadlist: break;
- case letter: letterwindow.Next(); break;
- case letter_help:helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: littleareas->Move(DOWN);
- littleareas->Draw();
- break;
- }
- }
-
- void Interface :: LEFT_ARROW(void)
- {
- switch(state)
- {
- case packetlist: packets.Move(UP); packets.Draw(); break;
- case arealist: do
- {
- areas.Move(UP); areas.Draw();
- } while((mm.areaList->getNoOfLetters() == 0) &&
- (mm.areaList->getAreaNo() > 1));
- if((mm.areaList->getAreaNo() == 1) &&
- (mm.areaList->getNoOfLetters() == 0))
- this->DOWN_ARROW();
- break;
- case letterlist: letters.Move(UP); letters.Draw(); break;
- case threadlist: break;
- case letter: letterwindow.Previous(); break;
- case letter_help:helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: littleareas->Move(UP);
- littleareas->Draw();
- break;
- }
- }
- void Interface :: HOME_KEY(void)
- {
- switch(state)
- {
- case packetlist: packets.Move(HOME); packets.Draw(); break;
- case arealist: areas.Move(HOME); areas.Draw(); break;
- case letterlist: letters.Move(HOME); letters.Draw(); break;
- case threadlist: break;
- case letter: letterwindow.Move(HOME); break;
- case letter_help:helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: littleareas->Move(HOME);
- littleareas->Draw();
- break;
- }
- }
-
- void Interface :: END_KEY(void)
- {
- switch(state)
- {
- case packetlist: packets.Move(END); packets.Draw(); break;
- case arealist: areas.Move(END); areas.Draw(); break;
- case letterlist: letters.Move(END); letters.Draw(); break;
- case threadlist: break;
- case letter: letterwindow.Move(END); break;
- case letter_help:helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: littleareas->Move(END);
- littleareas->Draw();
- break;
- }
- }
- void Interface :: PGUP_KEY(void)
- {
- switch(state)
- {
- case packetlist: packets.Move(PGUP); packets.Draw(); break;
- case arealist: areas.Move(PGUP); areas.Draw(); break;
- case letterlist: letters.Move(PGUP); letters.Draw(); break;
- case threadlist: break;
- case letter: letterwindow.Move(PGUP); break;
- case letter_help:helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: littleareas->Move(PGUP);
- littleareas->Draw();
- break;
- }
- }
- void Interface :: PGDN_KEY(void)
- {
- switch(state)
- {
- case packetlist: packets.Move(PGDN); packets.Draw(); break;
- case arealist: areas.Move(PGDN); areas.Draw(); break;
- case letterlist: letters.Move(PGDN); letters.Draw(); break;
- case threadlist: break;
- case letter: letterwindow.Move(PGDN); break;
- case letter_help:helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: littleareas->Move(PGDN);
- littleareas->Draw();
- break;
- }
- }
-
- void Interface :: help(void)
- {
- switch(state)
- {
- case packetlist: break;
- case arealist: break;
- case letterlist: break;
- case threadlist: break;
- case letter: if(mm.areaList->getType() != bwrep)
- helpwindow.letter();
- else
- helpwindow.reply_area_letter();
- state=letter_help;
- break;
- case letter_help: helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: break;
- }
- }
-
- void Interface :: enterletter(char key)
- {
- switch(state)
- {
- case packetlist: break;
- case arealist: if((mm.areaList->getType() != bwrep) && (key == 'E'))
- {
- if(strcmp(mm.areaList->getShortName(), "NET") != 0)
- {
- letterwindow.set_Letter_Params(
- mm.areaList->getAreaNo(), 'E');
- letterwindow.EnterLetter();
- unsaved_reply = 1;
- }
- else
- {
- addresses.MakeActive();
- letterwindow.set_Letter_Params(
- mm.areaList->getAreaNo(), 'E');
- if(!dontcallEnterLetter)
- letterwindow.EnterLetter();
- else
- dontcallEnterLetter = 0;
- }
- }
- break;
- case letterlist: if((mm.areaList->getType() != bwrep) && (key == 'E'))
- {
- if(strcmp(mm.areaList->getShortName(), "NET") != 0)
- {
- letterwindow.set_Letter_Params(
- mm.areaList->getAreaNo(), 'E');
- letterwindow.EnterLetter();
- unsaved_reply = 1;
- }
- else
- {
- addresses.MakeActive();
- letterwindow.set_Letter_Params(
- mm.areaList->getAreaNo(), 'E');
- if(!dontcallEnterLetter)
- letterwindow.EnterLetter();
- else
- dontcallEnterLetter = 0;
- }
- }
- break;
- case threadlist: break;
- case letter: if((mm.areaList->getType() != bwrep) && (key != 'N'))
- {
- Key = key;
- littleareas = new LittleAreaListWindow(key);
- state = littlearealist;
- unsaved_reply = 1;
- }
- if((mm.areaList->getType() != bwrep) && (key == 'N'))
- {
- net_address nm;
-
- Key = key;
- nm = letterwindow.PickNetAddr();
- letterwindow.set_Letter_Params(0, 'N');
- letterwindow.set_Letter_Params(&nm, NULL);
- letterwindow.EnterLetter();
- unsaved_reply = 1;
- }
- break;
- case letter_help: helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: break;
- }
- }
-
- void Interface :: save(void)
- {
- switch(state)
- {
- case packetlist: break;
- case arealist: break;
- case letterlist: letters.Save();
- break;
- case threadlist: break;
- case letter: letterwindow.Save(); break;
- case letter_help: helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: break;
- }
- }
-
- void Interface :: search(void)
- {
- }
-
- void Interface :: ANY_KEY(void)
- {
- switch(state)
- {
- case packetlist: break;
- case arealist: break;
- case letterlist: break;
- case threadlist: break;
- case letter: break;
- case letter_help: helpwindow.Delete();
- letterwindow.Draw();
- state=letter;
- break;
- case littlearealist: break;
- }
- }
-
- void Interface :: kill(void)
- {
- if(state == letter && mm.areaList->getType() == bwrep)
- {
- if(WarningWindow("Are You sure you want to delete this letter?",
- "Yes", "No"))
- {
- mm.areaList->killLetter(letterList->getLetterID());
- unsaved_reply = 1;
- back();
- if(mm.areaList->getNoOfLetters() == 0)
- back();
- else
- UP_ARROW();
-
- }
- else
- letterwindow.ReDraw();
- }
- }
-
- void Interface :: addressbook(void)
- {
- if(state != littlearealist)
- {
- addresses.MakeActive(1); //1 means NOENTER
- }
- }
-
- void Interface :: set_dontcallEnterLetter(void)
- {
- dontcallEnterLetter = 1;
- }
-